// Package main 演示GORM查询操作，包括各种查询方法的使用
// 本示例展示了GORM提供的多种查询API，如Find、Take、First、Last等
// 以及条件查询、限制结果数量和处理查询错误的方法
package main

import (
	"fmt"
	"gin-gorm/global"
	"gin-gorm/models"
)

// query 演示各种查询操作
// 该函数包含了多种GORM查询方法的使用示例
// 展示了如何执行条件查询、单条记录查询、限制结果数量和错误处理
func query() {
	// 定义用户列表变量
	// 用于存储查询结果的切片，将被填充为符合条件的所有记录
	var userList []models.UserModel

	// 查询所有年龄大于等于25的用户
	// Find方法用于查询多条记录，将结果填充到userList切片中
	// "age >= ?"是查询条件，?是占位符，避免SQL注入风险
	// 25是参数值，会替换占位符并应用到条件中
	global.DB.Find(&userList, "age >= ?", 25)
	fmt.Println("年龄>=25的用户列表:", userList)

	// 查询单条记录的相关示例（被注释掉）
	// 以下是各种单条记录查询方法的示例
	// var user models.UserModel // 定义用于存储单条记录的变量
	// global.DB.Take(&user) // 获取第一条记录，不保证顺序
	// global.DB.Take(&user, 2) // 根据主键ID查询记录，这里查询ID为2的记录
	// global.DB.First(&user, 3) // 获取第一条匹配的记录，按照主键升序排列
	// global.DB.Debug().First(&user) // 调试模式查询，会输出执行的SQL语句，便于调试
	// global.DB.Last(&user, 4) // 获取最后一条匹配的记录，按照主键降序排列

	// 根据条件查询用户
	// 示例展示如何通过结构体字段设置查询条件
	// user.ID = 3 // 设置结构体字段值作为查询条件
	// fmt.Println(user)
	// global.DB.Take(&user) // 根据结构体中的非零值构建查询条件

	// 处理查询不到记录的情况
	// 示例展示如何捕获记录不存在的错误
	// var user models.UserModel // 定义用于存储单条记录的变量
	// err := global.DB.Take(&user, 111).Error // 尝试查询ID为111的记录
	// if err == gorm.ErrRecordNotFound {
	// 	fmt.Println("记录不存在") // 处理记录不存在的情况
	// 	return
	// }
	// fmt.Println(user) // 输出查询到的用户信息

	// 使用Limit限制查询结果数量
	// 限制查询结果数量为1条，即使有更多匹配记录也只返回1条
	var user models.UserModel
	// 使用Limit(1)限制结果数量为1条，并尝试查询ID为111的记录
	// 注意：这里使用Find方法查询单条记录时，即使没有找到记录，user变量也会被初始化
	global.DB.Limit(1).Find(&user, 111)
	// 判断是否查询到记录（如果ID为0表示未查询到）
	// GORM中，如果查询不到记录但没有其他错误，会返回一个零值结构体
	fmt.Println("是否查询到用户:", user.ID != 0)
}

// main 程序入口函数
func main() {
	// 初始化数据库连接
	global.Connect()

	// 执行查询操作
	query()
}
